﻿Imports System.Data.SqlClient

Public Class Modificar

    Private _url_Servidor As String
    Private _obje As Libreria
    Private enlace As ADODB.Connection
    Dim url_Consulta As String
    Dim resp As ADODB.Recordset = New ADODB.Recordset
    Dim direccion_planeta As String = "", txtcodi_raza = "R_001"
    Public nume_defensas As Integer = 0, nume_naves = 0, nume_tropas = 0, numero_planetas = 0
    Dim lista_tropas As New ArrayList()
    Dim lista_naves As New ArrayList()
    Dim lista_defensas As New ArrayList()
    Public contenido_planeta As New ArrayList()
    Public Shared lst As ListaDobleConOrden = New ListaDobleConOrden()
    Public Shared arreglo_direccion As Direcciones

    Sub New(ByVal url_Servidor As String, ByVal obje As Libreria)
        InitializeComponent()
        ' TODO: Complete member initialization 
        _url_Servidor = url_Servidor
        _obje = obje
        If _url_Servidor.Contains(".mdb") Then
            obje.Setdriver_access()
            enlace = obje.getEnlace()
        ElseIf _url_Servidor.Contains("sqloledb") Then
            obje.Setdriver_sql()
            enlace = obje.getEnlace()
        ElseIf _url_Servidor.Contains("MySQL") Then
            obje.Setdriver_mysql()
            enlace = obje.getEnlace()
        End If
    End Sub

    Private Sub btnConsulta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConsulta.Click
        Ejecucion()
        RECARGAR_TROPAS()
        RECARGAR_NAVES()
        RECARGAR_DEFENSAS()
    End Sub
    Private Sub RECARGAR_NAVES()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Naves where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_naves = lista.Count
                Console.WriteLine("naves " & nume_naves)
                lista_naves = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Naves, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub
    Private Sub Crear_Objetos(ByVal espaciado As Integer, ByVal panel_padre As TabPage, ByVal lista As ArrayList)
        Dim etiketa(0 To lista.Count - 1) As Label
        Dim objetos_texto(0 To espaciado - 1) As TextBox
        For i As Integer = 0 To lista.Count - 1
            etiketa(i) = New Label()
            etiketa(i).Text = lista.Item(i).ToString
            panel_padre.Controls.Add(etiketa(i))

            objetos_texto(i) = New TextBox()
            panel_padre.Controls.Add(objetos_texto(i))
            objetos_texto(i).Text = ("")

            objetos_texto(i).SetBounds(300, 5 + espaciado * i, 50, 20)
            etiketa(i).SetBounds(20, 5 + espaciado * i, 150, 20)

        Next
    End Sub

    Private Sub RECARGAR_TROPAS()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Tropas where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_tropas = lista.Count
                Console.WriteLine("Tropas " & nume_tropas)
                lista_tropas = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Tropas, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub

    Private Sub RECARGAR_DEFENSAS()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Defensas where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_defensas = lista.Count
                Console.WriteLine("def " & nume_defensas)
                lista_defensas = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Defensas, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub
    Private Sub Registrar_user_planetas(ByVal usuario As String)
        If enlace IsNot Nothing Then
            For i As Integer = 0 To listDirecciones.Items.Count - 1
                Try
                    'updatear o saltar los ya registrados
                    url_Consulta = "INSERT INTO Direcciones (Numero_direccion, Galaxia, nomb_usuarios) VALUES ('" & listDirecciones.Items(i).Text.Trim & "', '" & Deducir_galaxia(listDirecciones.Items(i).Text.Trim) & "', '" & usuario & "')"
                    enlace.Execute(url_Consulta)
                Catch ex As Exception
                    url_Consulta = "UPDATE Direcciones SET Galaxia = '" & Deducir_galaxia(listDirecciones.Items(i).Text.Trim) & "' WHERE (Numero_direccion = '" & listDirecciones.Items(i).Text.Trim & "') AND (Galaxia = '" & Deducir_galaxia(listDirecciones.Items(i).Text.Trim) & "') AND (nomb_usuarios = '" & usuario & "')"
                    MessageBox.Show(Nothing, "La direccion ya esta usada eliminela y elija otra", "titulo")
                End Try
            Next

        End If
    End Sub
    Private Function Deducir_galaxia(ByVal direccion As String) As String
        Dim nombre_galaxia As String = ""
        Dim primeraletra As Char = direccion.Chars(0)
        'Console.WriteLine(primeraletra)
        If primeraletra = "P".Chars(0) Then
            nombre_galaxia = "Pegasus"
        ElseIf primeraletra = "A".Chars(0) Then
            nombre_galaxia = "Andrómeda"
        ElseIf primeraletra = "M".Chars(0) Then
            nombre_galaxia = "Midway"
        ElseIf primeraletra = "V".Chars(0) Then
            nombre_galaxia = "Vía Láctea"
        End If
        Return nombre_galaxia
    End Function
    Private Sub listDirecciones_ItemSelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles listDirecciones.ItemSelectionChanged
        For i As Integer = 0 To listDirecciones.SelectedIndices.Count - 1
            Console.WriteLine(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
            direccion_planeta = listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text
            LLAMAR_VALORES_ED(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
        Next i
    End Sub
    Private Sub Ejecucion()
        Dim encontrado As Boolean = False
        Dim contador As Integer = 0
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "SELECT usuarios.nomb_usuarios,usuarios.codi_raza, Razas.nomb_raza FROM usuarios " &
                    "INNER JOIN Razas ON usuarios.codi_raza = Razas.codi_raza where" &
                    " usuarios.nomb_usuarios = '" & txtUser.Text.Trim & "'"
                resp = enlace.Execute(url_Consulta)
                Console.WriteLine(url_Consulta)
                While resp.EOF <> True
                    ' El metodo getObject llama a las columnas
                    'ya sea por su nombre o su indice de columna en este caso comensando en 1
                    txtRaza.Text = resp.Fields(2).Value.ToString
                    txtcodi_raza = resp.Fields(1).Value.ToString
                    If resp.Fields(0).Value.ToString.Equals(txtUser.Text().Trim()) Then
                        encontrado = True
                    End If
                    resp.MoveNext()
                End While
                If encontrado Then
                    url_Consulta = "SELECT Numero_direccion, Galaxia,nomb_usuarios" &
                        " FROM Direcciones where nomb_usuarios = '" & txtUser.Text.Trim & "'"
                    resp = enlace.Execute(url_Consulta)
                    While resp.EOF <> True
                        Agregar_Lista(resp.Fields(0).Value.ToString)
                        contador = contador + 1
                        resp.MoveNext()
                    End While
                    For i As Integer = 0 To contador - 1
                        EJECUTAR_ELEMENTOS(listDirecciones.Items(i).Text.Trim)
                    Next
                Else
                    MessageBox.Show("No se hallo la consulta")
                End If
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode.ToString)
            End Try

        End If
    End Sub
    Private Sub Agregar_Lista(ByVal p1 As String)
        listDirecciones.Items.Add(p1)
    End Sub
    Private Sub LLAMAR_VALORES_ED(ByVal valor As String)
        Dim auxiliar As NodoDoble = lst.busca(valor)
        Dim temporal As New ArrayList()
        If Not IsNothing(auxiliar) Then
            arreglo_direccion = auxiliar.getNodo()
            temporal = arreglo_direccion.getContenido()
            For i As Integer = 0 To nume_tropas - 1
                Dim cajatexto As String = temporal.Item(i + 1).ToString
                Console.WriteLine("indice " & i & "valor1 " + cajatexto)
                Tropas.Controls(i * 2 + 1).Text = cajatexto
            Next

            For i As Integer = 0 To nume_naves - 1
                Dim cajatexto As String = temporal.Item(i + nume_tropas + 1).ToString
                Console.WriteLine("indice " & i & "valor2 " + cajatexto)
                Naves.Controls(i * 2 + 1).Text = cajatexto
            Next

            For i As Integer = 0 To nume_defensas - 1
                Dim cajatexto As String = temporal.Item(i + nume_tropas + nume_naves + 1).ToString
                Defensas.Controls(i * 2 + 1).Text = cajatexto
            Next

        End If
    End Sub
    Private Sub IngresaDatos(ByVal direccion As String, ByVal contenido_planeta As ArrayList)
        arreglo_direccion = New Direcciones()
        arreglo_direccion.setContenido(contenido_planeta)
        arreglo_direccion.setNombre(direccion)

    End Sub

    Private Sub EJECUTAR_ELEMENTOS(ByVal txtdireccion As String)
        Dim temporal As ArrayList = New ArrayList()
        temporal.Add(txtdireccion)
        Try
            url_Consulta = "SELECT cantidad_trop, numero_Direccion FROM usuario_numero_tropas WHERE (numero_Direccion = '" & txtdireccion & "')"
            resp = enlace.Execute(url_Consulta)
            While resp.EOF <> True
                temporal.Add(resp.Fields(0).Value.ToString)
                resp.MoveNext()
            End While

            url_Consulta = "SELECT cantidad_nav, numero_Direccion FROM usuario_numero_naves WHERE (numero_Direccion = '" & txtdireccion & "')"
            resp = enlace.Execute(url_Consulta)
            While resp.EOF <> True
                temporal.Add(resp.Fields(0).Value.ToString)
                resp.MoveNext()
            End While

            url_Consulta = "SELECT cantidad_def, numero_Direccion FROM usuario_numero_Defensas WHERE (numero_Direccion = '" & txtdireccion & "')"
            resp = enlace.Execute(url_Consulta)
            While resp.EOF <> True
                temporal.Add(resp.Fields(0).Value.ToString)
                resp.MoveNext()
            End While
            IngresaDatos(txtdireccion, temporal)
            lst.agrega(arreglo_direccion)

        Catch ex As SqlException

        End Try


    End Sub
    Private Sub ACTUALIZA_VALORES_ED(ByVal cadena As String)
        Console.WriteLine("cargado" & cadena)
        Dim temporal As New ArrayList()
        temporal.Add(cadena)
        For i As Integer = 0 To nume_tropas - 1
            Dim valor_caja_texto As String = (Tropas.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("tropas " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next

        For i As Integer = 0 To nume_naves - 1
            Dim valor_caja_texto As String = (Naves.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("naves " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next

        For i As Integer = 0 To nume_defensas - 1
            Dim valor_caja_texto As String = (Defensas.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("defensas " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next
        'busca el dato para actualizar valores
        Dim auxiliar As NodoDoble = lst.busca(cadena)
        If auxiliar IsNot Nothing Then
            ' no lo encontró
            arreglo_direccion = auxiliar.getNodo()
            arreglo_direccion.setContenido(temporal)
            For i As Integer = 1 To temporal.Count - 1
                Console.WriteLine("valores cargados " & temporal.Item(i))
            Next

        End If
        'Guarda informacion de paneles
    End Sub
    Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
        For i As Integer = 0 To listDirecciones.SelectedIndices.Count - 1
            ACTUALIZA_VALORES_ED(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
        Next i
    End Sub
    Private Function DIRE_LIBRE(ByVal direccion As String) As Boolean
        Dim retorno As Boolean = True
        Try
            url_Consulta = "select Numero_direccion from `Direcciones` where Numero_direccion='" & direccion & "'"
            resp = enlace.Execute(url_Consulta)
            While resp.EOF <> True
                retorno = False
                resp.MoveNext()
            End While
        Catch ex As SqlException
            Console.WriteLine(ex.ErrorCode)
        End Try
        Return retorno
    End Function
    Private Sub Activar_Contenedor(ByVal tabPage As TabPage)
        Dim Control As Control
        For Each Control In tabPage.Controls
            Control.Enabled = True
        Next
    End Sub
    Private Sub Desactivar_Contenedor(ByVal tabPage As TabPage)
        Dim Control As Control
        For Each Control In tabPage.Controls
            Control.Enabled = False
        Next
    End Sub
    Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
        Try
            If listDirecciones.Items.Count < 5 Then
                Dim direccion As String = InputBox("Ingrese Direccion", "Titulo")
                Console.WriteLine(DIRE_LIBRE(direccion))
                Console.WriteLine(Not direccion = "")
                If Not direccion = "" And DIRE_LIBRE(direccion) Then
                    listDirecciones.Items.Add(direccion)
                    'Agregar estructura dinamica
                    contenido_planeta.Add(direccion) 'el planeta sera la cabecera
                    For i As Integer = 1 To (nume_defensas + nume_naves + nume_tropas + 1) - 1
                        contenido_planeta.Add("0") 'valor inicial de las unidades es 0
                    Next
                    IngresaDatos(direccion, contenido_planeta)
                    lst.agrega(arreglo_direccion)

                Else
                    MessageBox.Show(Nothing, "Direccion vacia o ya usada", "Advertencia")
                    Return 'Regresa a la instruccion inicial
                End If
            Else
                Console.WriteLine("acabo")
            End If
        Catch es As Exception
            MessageBox.Show(Nothing, "Agrege algo a la direccion", "Error")

        End Try
    End Sub

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
        Dim direccion As String = listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text
        Try
            Dim auxiliar As NodoDoble = lst.busca(direccion)
            If auxiliar IsNot Nothing Then
                lst.elimina(auxiliar)
                'eliminar planeta en consulta
                url_Consulta = "DELETE FROM Direcciones WHERE (Numero_direccion = '" & direccion & "')"
                enlace.Execute(url_Consulta)
                url_Consulta = "DELETE FROM usuario_numero_tropas WHERE (numero_Direccion = '" & direccion & "')"
                enlace.Execute(url_Consulta)
                url_Consulta = "DELETE FROM usuario_numero_naves WHERE (numero_Direccion = '" & direccion & "')"
                enlace.Execute(url_Consulta)
                url_Consulta = "DELETE FROM usuario_numero_Defensas WHERE (numero_Direccion = '" & direccion & "')"
                enlace.Execute(url_Consulta)

            End If

            For i As Integer = 0 To listDirecciones.SelectedIndices.Count - 1
                listDirecciones.Items.RemoveAt(listDirecciones.SelectedIndices(0))
            Next i
        Catch ex As Exception
            Console.WriteLine("vacio o sin seleccionar")

        End Try


    End Sub

    Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click
        EJECUTAR_MODIFICACION()
        lst.setInicio(Nothing)
    End Sub
    Public Sub EJECUTAR_MODIFICACION()
        ' TODO actualizar
        'Actualizar planetas
        Registrar_user_planetas(txtUser.Text().Trim())
        'Actualizar unidades x planetas
        Modificar_unidades_planetas()
        ' evita doble ejecucion
        btnConsulta.Enabled = (False)
        btnAgregar.Enabled = (False)
        btnEliminar.Enabled = (False)
        btnGuardar.Enabled = (False)
        btnRegistrar.Enabled = (False)
        Paneles.Enabled = False
        'menu_Cambios.Enabled = (False)

    End Sub
    Private Sub Modificar_unidades_planetas()
        Try
            Dim direccion_actual As String = listDirecciones.SelectedItems(0).Text
            Dim usuario As String = txtUser.Text().Trim()
            'hacer consulta
            'llamar nombre de usuario
            'llamar cada direccion en la ED
            Dim auxiliar As NodoDoble = lst.getInicio()
            While auxiliar IsNot Nothing
                Dim temp As ArrayList = auxiliar.getNodo().getContenido()
                If BUSCAREXISTENCIA(temp.Item(0).ToString) Then
                    'Si existe actualizar
                    For i As Integer = 1 To temp.Count - 1
                        If i <= lista_tropas.Count Then
                            Try
                                url_Consulta = "UPDATE `usuario_numero_tropas` SET `cantidad_trop` = '" & temp.Item(i) & "' WHERE `nomb_usuarios` = '" & usuario & "' AND `numero_Direccion` = '" & temp.Item(0) & "' AND `nomb_tropas` = '" & (Tropas.Controls((i - 1) * 2)).Text().Trim() & "'"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '
                            End Try
                        ElseIf i > lista_tropas.Count AndAlso i <= (lista_naves.Count + lista_tropas.Count) Then
                            Try
                                url_Consulta = "UPDATE `usuario_numero_naves` SET `cantidad_nav` = '" & temp.Item(i) & "' WHERE `nomb_usuarios` = '" & usuario & "' AND `Nomb_Naves` = '" & (Naves.Controls((i - 1 - lista_tropas.Count) * 2)).Text().Trim() & "' AND `numero_Direccion` = '" & temp.Item(0) & "'"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '
                            End Try
                        ElseIf i > (lista_naves.Count + lista_tropas.Count) Then
                            Try
                                url_Consulta = "UPDATE `usuario_numero_Defensas` SET `cantidad_def` = '" & temp.Item(i) & "' WHERE `nomb_usuarios` = '" & usuario & "' AND `nomb_Defensas` = '" & Defensas.Controls((i - 1 - lista_tropas.Count - lista_naves.Count) * 2).Text().Trim() & "' AND `numero_Direccion` = '" & temp.Item(0) & "'"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '
                            End Try
                        End If
                    Next
                Else
                    'Si no existe insertar
                    For i As Integer = 1 To temp.Count - 1
                        If i <= lista_tropas.Count Then
                            Try
                                url_Consulta = "INSERT INTO usuario_numero_tropas " & "(nomb_usuarios, nomb_tropas, cantidad_trop, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Tropas.Controls((i - 1) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '
                            End Try

                        ElseIf i > lista_tropas.Count AndAlso i <= (lista_naves.Count + lista_tropas.Count) Then
                            Try
                                url_Consulta = "INSERT INTO usuario_numero_naves " & "(nomb_usuarios, Nomb_Naves, cantidad_nav, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Naves.Controls((i - 1 - lista_tropas.Count) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '

                            End Try

                        ElseIf i > (lista_naves.Count + lista_tropas.Count) Then
                            Try
                                url_Consulta = "INSERT INTO usuario_numero_Defensas " & "(nomb_usuarios, nomb_Defensas, cantidad_def, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Defensas.Controls((i - 1 - lista_tropas.Count - lista_naves.Count) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                                Console.WriteLine(url_Consulta)
                                enlace.Execute(url_Consulta)

                            Catch ex As SqlException
                                '
                            End Try
                        End If
                    Next
                End If
                auxiliar = auxiliar.getApuntSgte()

            End While
            'por cada direccion hacer una consulta de insert

        Catch e As Exception
            'error
        End Try
    End Sub
    Private Function BUSCAREXISTENCIA(ByVal direccion As String) As Boolean
        Dim existencia As Boolean = False
        Try
            'buscar si existe la direccion en una tabla;
            Dim url As String = "select * from usuario_numero_Defensas where numero_Direccion = '" & direccion & "'"
            resp = enlace.Execute(url)
            While resp.EOF <> True
                existencia = True
                resp.MoveNext()
            End While
        Catch ex As SqlException
        End Try
        Return existencia
    End Function


    Private Sub RealizarCambiosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RealizarCambiosToolStripMenuItem.Click
        EJECUTAR_MODIFICACION()
        lst.setInicio(Nothing)
    End Sub
End Class